在函数内部定义的变量称为自动型,它们的作用域定义在函数内部。不同的函数里若出现相同名字的变量,则它们是毫不相干的。自动型变量定义以关键字auto标识,但在函数内部可以省略。
编译程序为自动型变量动态分配存储空间。具体地说,这些自动型变量使用的栈空间在进入函数时就给予分配,一旦退出该函数,分配给它的空间就立即消失(即这些自动型变量消失),所以自动型变量即不能被其他函数所引用,也不能保存其值。
C语言规定,任何以花括号“{”和“}”括起来的复合语句都属于块结构,在块内可以对变量进行定义,在块内定义的变量其作用域仅限于块内。若块内定义与块外或外部定义具有相同的变量名,则它们是没有关系的。
外部型变量就是在任何函数的外部定义的变量,它可以被程序中的所有函数所引用。
外部型变量实质上具有“全局型”定义,它的作用域是整个程序。在程序的任何地方均可以通过不同的名字对这种变量进行访问,但如果有同名变量,则只有内部变量起作用。
引用外部变量主要有以下3个原因:
1 作为函数之间通信的一种方式。因为外部型变量在整个程序中都可存取。
2 外部型变量与初始化有关,有时需要由外部变量提供初始值。
3 外部变量是永久的,在一次函数调用之后到下一次函数调用之前的期间内,能保持它的值不变。
外部型变量必须在任何函数之外定义,在整个程序(可能有若干个文件)中都具有相同名字的外部型变量只能在一处定义和初始化,对定义的外部型变量,由编译程序静态地为它们分配适当的存储空间。
如果要在定义一个外部型变量之前使用它,或者它被定义在另一个源文件里,那就必须使用关键字extern进行声明。
静态型变一可以是内部静态数定义为静态的,被定义为外部静态的函数只能被函数所在的文件中的其他函数调用,而不能被其他文件中的函数调用。
通过将变量或函数定义为外部静态型,可以将一个文件中的一些函数和数据隐藏起来,不允许别的文件存取。这种功能可以使模块程序设计更方便,特别是当设计一个大的系统时,一般由若干个程序员来设计编写程序,对那些只局限于某些程序使用的全局变量和函数,只要将其定义为外部静态型,就可以既防止与其他程序员写的程序产生重名,又使模块界限清晰。